home *** CD-ROM | disk | FTP | other *** search
/ Aminet 15 / Aminet 15 - Nov 1996.iso / Aminet / dev / c / EasygadgetsSou.lha / EasyGadgets / IconifyButtonClass.c < prev    next >
C/C++ Source or Header  |  1995-10-09  |  5KB  |  217 lines

  1. /*
  2.  *    File:                    IconifyButtonClass.c
  3.  *    Description:    
  4.  *
  5.  *    (C) 1995, Ketil Hunn
  6.  *
  7.  */
  8.  
  9. /*** PRIVATE INCLUDES ****************************************************************/
  10. #include <exec/types.h>
  11. #include <intuition/intuition.h>
  12. #include <intuition/classes.h>
  13. #include <intuition/classusr.h>
  14. #include <intuition/imageclass.h>
  15. #include <intuition/gadgetclass.h>
  16. #include <intuition/cghooks.h>
  17. #include <intuition/icclass.h>
  18. #include <utility/tagitem.h>
  19. #include <utility/hooks.h>
  20. #include <graphics/rpattr.h>
  21. #include <graphics/gfxmacros.h>
  22. #include <dos.h>
  23.  
  24. #include <clib/exec_protos.h>
  25. #include <clib/intuition_protos.h>
  26. #include <clib/graphics_protos.h>
  27. #include <clib/utility_protos.h>
  28. #include <clib/alib_protos.h>
  29. #include <clib/alib_stdio_protos.h>
  30.  
  31. /*** PROTOTYPES **********************************************************************/
  32.  
  33. ULONG __asm dispatchIconifyButton(register __a0 Class        *class,
  34.                                                                     register __a2 Object    *o,
  35.                                                                     register __a1 Msg            msg);
  36. __asm  ULONG renderIconifyButton(    register __a0 struct Gadget        *g,
  37.                                                                     register __a1 struct gpRender    *msg);
  38.  
  39. /*** FUNCTIONS ***********************************************************************/
  40. __asm Class *initIconifyButtonClass(void)
  41. {
  42.     Class    *class;
  43.  
  44.     if(class=MakeClass(NULL, GADGETCLASS, NULL, NULL, 0))
  45.     {
  46.         class->cl_Dispatcher.h_Entry        =(HOOKFUNC)dispatchIconifyButton;
  47.         class->cl_Dispatcher.h_SubEntry    =NULL;
  48.         class->cl_Dispatcher.h_Data            =(void *)getreg(REG_A4);
  49.     }
  50.     return class;
  51. }
  52.  
  53.  
  54. __asm void RenderIconifyButton(    register __a0 Object                        *o,
  55.                                                                 register __a1 struct GadgetInfo    *gi)
  56. {
  57.     register struct RastPort *rp;
  58.  
  59.     if(rp=ObtainGIRPort(gi))
  60.     {
  61.         DoMethod(o, GM_RENDER, gi, rp, GREDRAW_REDRAW);
  62.         ReleaseGIRPort(rp);
  63.     }
  64. }
  65.  
  66. ULONG __asm dispatchIconifyButton(register __a0 Class        *class,
  67.                                                                     register __a2 Object    *o,
  68.                                                                     register __a1 Msg            msg)
  69. {
  70.     ULONG    retval=FALSE;
  71.  
  72.     putreg(REG_A4, (long)class->cl_Dispatcher.h_Data);
  73.     switch (msg->MethodID)
  74.     {
  75.         case GM_HITTEST:
  76.             retval=GMR_GADGETHIT;
  77.             break;
  78.  
  79.         case GM_GOACTIVE:
  80.             if(((struct gpInput *)msg)->gpi_IEvent)
  81.             {
  82.                 SETBIT(((struct Gadget *)o)->Flags, GFLG_SELECTED);
  83.                 RenderIconifyButton(o, ((struct gpInput *)msg)->gpi_GInfo);
  84.                 retval=GMR_MEACTIVE;
  85.             }
  86.             else
  87.                 retval=GMR_NOREUSE;
  88.             break;
  89.  
  90.         case GM_GOINACTIVE:
  91.             CLEARBIT(((struct Gadget *)o)->Flags, GFLG_SELECTED);
  92.             RenderIconifyButton(o, ((struct gpGoInactive *)msg)->gpgi_GInfo);
  93.             break;
  94.  
  95.         case GM_RENDER:
  96.             renderIconifyButton((struct Gadget *)o, (struct gpRender *)msg);
  97.             break;
  98.  
  99.         case GM_HANDLEINPUT:
  100.             {
  101.                 struct Gadget            *g        =(struct Gadget *)o;
  102.                 struct gpInput        *gpi    =(struct gpInput *)msg;
  103.                 struct InputEvent    *ie        =gpi->gpi_IEvent;
  104.  
  105.                 retval=GMR_MEACTIVE;
  106.  
  107.                 if(ie->ie_Class==IECLASS_RAWMOUSE)
  108.                 {
  109.                     switch (ie->ie_Code)
  110.                     {
  111.                         case SELECTUP:
  112.                             if(    (gpi->gpi_Mouse.X<0)                ||
  113.                                     (gpi->gpi_Mouse.X>g->Width)    ||
  114.                                     (gpi->gpi_Mouse.Y<0)                ||
  115.                                     (gpi->gpi_Mouse.Y>g->Height))
  116.                                 retval=GMR_REUSE;
  117.                             else
  118.                                 retval=GMR_NOREUSE|GMR_VERIFY;
  119.                             break;
  120.  
  121.                         case MENUDOWN:
  122.                             retval=GMR_REUSE;
  123.                             break;
  124.  
  125.                         case IECODE_NOBUTTON:
  126.                             if(    (gpi->gpi_Mouse.X<0)                ||
  127.                                     (gpi->gpi_Mouse.X>g->Width)    ||
  128.                                     (gpi->gpi_Mouse.Y<0)                ||
  129.                                     (gpi->gpi_Mouse.Y>g->Height))
  130.                             {
  131.                                 if(ISBITSET(g->Flags, GFLG_SELECTED))
  132.                                 {
  133.                                     CLEARBIT(g->Flags, GFLG_SELECTED);
  134.                                     RenderIconifyButton(o, gpi->gpi_GInfo);
  135.                                 }
  136.                             }
  137.                             else if(ISBITCLEARED(g->Flags, GFLG_SELECTED))
  138.                             {
  139.                                 SETBIT(g->Flags, GFLG_SELECTED);
  140.                                 RenderIconifyButton(o, gpi->gpi_GInfo);
  141.                             }
  142.                             break;
  143.                     }
  144.                 }
  145.             }
  146.             break;
  147.  
  148.         default:
  149.             retval=DoSuperMethodA(class, o, msg);
  150.             break;
  151.     }
  152.     return retval;
  153. }
  154.  
  155. __asm void drawFrame(    register __a0 struct RastPort *rp,
  156.                                             register __d4 UWORD                        pen1,
  157.                                             register __d5 UWORD                        pen2,
  158.                                             register __d0 WORD                        x,
  159.                                             register __d1 WORD                        y,
  160.                                             register __d2 WORD                        w,
  161.                                             register __d3 WORD                        h)
  162.                                             
  163. {
  164.     SetAPen(rp, pen1);
  165.     Move(rp, x,        y+h-1);
  166.     Draw(rp, x,        y);
  167.     Draw(rp, x+w-1,    y);
  168.  
  169.     SetAPen(rp, pen2);
  170.     Move(rp, x+w, y+1);
  171.     Draw(rp, x+w, y+h);
  172.     Draw(rp, x+1, y+h);
  173. }
  174.  
  175. __asm ULONG renderIconifyButton(register __a0 struct Gadget        *g,
  176.                                                                 register __a1 struct gpRender    *msg)
  177. {
  178.     struct RastPort        *rp=msg->gpr_RPort;
  179.     ULONG retval            =FALSE;
  180.     UWORD    *pens                =msg->gpr_GInfo->gi_DrInfo->dri_Pens;
  181.  
  182.     if(rp && pens)
  183.     {
  184.         register BYTE selected=(g->Flags & GFLG_SELECTED);
  185.         register UWORD    x=g->LeftEdge+1,
  186.                                         y=g->TopEdge,
  187.                                         w=g->Width-2,
  188.                                         h=g->Height;
  189.         UWORD hmarg=5, //g->Width/5,
  190.                     vmarg=g->Width/7-(g->Height<11 ? 1:0);
  191.  
  192.         if(ISBITSET(g->Flags, GFLG_RELRIGHT))
  193.             x+=msg->gpr_GInfo->gi_Domain.Width-1;
  194.  
  195.         SetAPen(rp, pens[SHADOWPEN]);
  196.  
  197.         Move(rp, x-1, y+1);
  198.         Draw(rp, x-1, y+h);
  199.  
  200.         if(selected)
  201.         {
  202.             drawFrame(rp, pens[SHADOWPEN], pens[SHINEPEN], x,y,w,h);
  203.             drawFrame(rp, pens[SHINEPEN], pens[SHADOWPEN], x+hmarg,y+vmarg,w-hmarg*2,h-vmarg*2);
  204.             drawFrame(rp, pens[SHADOWPEN], pens[SHINEPEN], x+hmarg+1,y+h-vmarg-3,2,2);
  205.         }
  206.         else
  207.         {
  208.             drawFrame(rp, pens[SHINEPEN], pens[SHADOWPEN], x,y,w,h);
  209.             drawFrame(rp, pens[SHADOWPEN], pens[SHINEPEN], x+hmarg,y+vmarg,w-hmarg*2,h-vmarg*2);
  210.             drawFrame(rp, pens[SHINEPEN], pens[SHADOWPEN], x+hmarg+1,y+h-vmarg-3,2,2);
  211.         }
  212.  
  213.         retval=TRUE;
  214.     }
  215.     return retval;
  216. }
  217.